﻿using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace RoutingDemo.Constrains
{
    public class MyRouteConstraint : IRouteConstraint
    {
        /// <summary>
        /// 自定义约束 MyRouteConstraint
        /// </summary>
        /// <param name="httpContext">http当前的context</param>
        /// <param name="route"></param>
        /// <param name="routeKey">要验证的key值，也就是参数名</param>
        /// <param name="values">我们当前可以获取到routeKey对应的传入的值是什么</param>
        /// <param name="routeDirection">这个枚举的作用是我们当前的验证是用来验证url请求进来，验证是否路由匹配，还是用来生成url，是进还是出，这样的一个定义</param>
        /// <returns></returns>
        public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
        {
            //在不同的场景下响应的逻辑是不一样的，    我这里的逻辑是如果说是路由是进来，也就是通过url来匹配action 的情况，我们就判断
            if (RouteDirection.IncomingRequest==routeDirection)
            {
                //根据routeKey去拿当前输入的值，判断是否可以转成long
                var v = values[routeKey];
                //其实是模拟了我们的类型验证
                if (long.TryParse(v.ToString(),out var value))
                {
                    return true;
                }
            }
            return false;
        }
    }
}
